package com.cencat.order.service;

import com.cencat.order.domain.Driver;
import com.cencat.order.domain.DriverAuth;
import com.cencat.order.domain.DriverLocation;
import com.cencat.order.domain.DriverStatistics;
import com.cencat.order.domain.vo.DriverVO;
import com.cencat.order.domain.vo.DriverStatisticsVO;
import com.cencat.order.domain.vo.DriverAnalysisVO;
import com.cencat.order.domain.dto.DriverCreateDTO;
import com.cencat.order.domain.dto.DriverUpdateDTO;
import com.cencat.order.domain.dto.DriverLocationDTO;
import com.cencat.order.domain.dto.DriverLoginDTO;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
 * 司机管理服务接口
 * 
 * @author cencat
 * @date 2024-01-20
 */
public interface IDriverService extends IService<Driver> {

    /**
     * 查询司机列表
     * 
     * @param driver 司机查询条件
     * @return 司机列表
     */
    List<Driver> selectDriverList(Driver driver);

    /**
     * 获取司机详情
     * 
     * @param driverId 司机ID
     * @return 司机详情VO
     */
    DriverVO getDriverDetail(Long driverId);

    /**
     * 根据手机号获取司机信息
     * 
     * @param phone 手机号
     * @return 司机信息
     */
    Driver getDriverByPhone(String phone);

    /**
     * 新增司机
     * 
     * @param createDTO 创建司机DTO
     * @return 司机详情VO
     */
    DriverVO createDriver(DriverCreateDTO createDTO);

    /**
     * 修改司机
     * 
     * @param updateDTO 更新司机DTO
     * @return 是否成功
     */
    boolean updateDriver(DriverUpdateDTO updateDTO);

    /**
     * 删除司机
     * 
     * @param driverIds 司机ID数组
     * @return 是否成功
     */
    boolean deleteDriverByIds(Long[] driverIds);

    /**
     * 司机认证登录
     */
    
    /**
     * 司机登录
     * 
     * @param loginDTO 登录DTO
     * @return 登录结果
     */
    Map<String, Object> driverLogin(DriverLoginDTO loginDTO);

    /**
     * 司机登出
     * 
     * @param driverId 司机ID
     * @param token 令牌
     * @return 是否成功
     */
    boolean driverLogout(Long driverId, String token);

    /**
     * 刷新Token
     * 
     * @param refreshToken 刷新令牌
     * @return 新的Token信息
     */
    Map<String, Object> refreshDriverToken(String refreshToken);

    /**
     * 司机注册
     * 
     * @param registerData 注册数据
     * @return 注册结果
     */
    Map<String, Object> registerDriver(Map<String, Object> registerData);

    /**
     * 验证司机Token
     * 
     * @param token 令牌
     * @return 验证结果
     */
    Map<String, Object> validateDriverToken(String token);

    /**
     * 司机信息管理
     */
    
    /**
     * 获取司机个人信息
     * 
     * @param driverId 司机ID
     * @return 个人信息
     */
    Map<String, Object> getDriverInfo(Long driverId);

    /**
     * 更新司机个人信息
     * 
     * @param driverId 司机ID
     * @param updateData 更新数据
     * @return 是否成功
     */
    boolean updateDriverInfo(Long driverId, Map<String, Object> updateData);

    /**
     * 修改司机密码
     * 
     * @param driverId 司机ID
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 是否成功
     */
    boolean changeDriverPassword(Long driverId, String oldPassword, String newPassword);

    /**
     * 重置司机密码
     * 
     * @param driverId 司机ID
     * @param newPassword 新密码
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean resetDriverPassword(Long driverId, String newPassword, Long operatorId);

    /**
     * 司机位置与状态
     */
    
    /**
     * 更新司机位置
     * 
     * @param locationDTO 位置DTO
     * @return 是否成功
     */
    boolean updateDriverLocation(DriverLocationDTO locationDTO);

    /**
     * 获取司机当前位置
     * 
     * @param driverId 司机ID
     * @return 位置信息
     */
    DriverLocation getDriverCurrentLocation(Long driverId);

    /**
     * 更新司机状态
     * 
     * @param driverId 司机ID
     * @param status 状态
     * @param statusRemark 状态备注
     * @return 是否成功
     */
    boolean updateDriverStatus(Long driverId, String status, String statusRemark);

    /**
     * 获取司机状态历史
     * 
     * @param driverId 司机ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 状态历史列表
     */
    List<Map<String, Object>> getDriverStatusHistory(Long driverId, String startDate, String endDate);

    /**
     * 司机签到签退
     * 
     * @param driverId 司机ID
     * @param actionType 操作类型(签到/签退)
     * @param location 位置信息
     * @return 是否成功
     */
    boolean driverCheckInOut(Long driverId, String actionType, String location);

    /**
     * 获取司机考勤记录
     * 
     * @param driverId 司机ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 考勤记录列表
     */
    List<Map<String, Object>> getDriverAttendance(Long driverId, String startDate, String endDate);

    /**
     * 司机实名认证
     */
    
    /**
     * 提交实名认证
     * 
     * @param driverId 司机ID
     * @param authType 认证类型
     * @param authData 认证数据
     * @return 认证ID
     */
    Long submitDriverAuth(Long driverId, String authType, Map<String, Object> authData);

    /**
     * 审核司机实名认证
     * 
     * @param authId 认证ID
     * @param auditResult 审核结果
     * @param auditRemark 审核备注
     * @param auditorId 审核人ID
     * @return 是否成功
     */
    boolean auditDriverAuth(Long authId, String auditResult, String auditRemark, Long auditorId);

    /**
     * 获取司机认证信息
     * 
     * @param driverId 司机ID
     * @param authType 认证类型
     * @return 认证信息
     */
    DriverAuth getDriverAuth(Long driverId, String authType);

    /**
     * 批量审核司机认证
     * 
     * @param authIds 认证ID数组
     * @param auditResult 审核结果
     * @param auditRemark 审核备注
     * @param auditorId 审核人ID
     * @return 审核结果
     */
    Map<String, Object> batchAuditDriverAuth(Long[] authIds, String auditResult, String auditRemark, Long auditorId);

    /**
     * 司机查询与管理
     */
    
    /**
     * 获取附近司机列表
     * 
     * @param latitude 纬度
     * @param longitude 经度
     * @param radius 半径(米)
     * @param status 司机状态
     * @return 附近司机列表
     */
    List<Map<String, Object>> getNearbyDrivers(Double latitude, Double longitude, Integer radius, String status);

    /**
     * 分页查询司机列表
     * 
     * @param pageNum 页码
     * @param pageSize 页大小
     * @param queryParams 查询参数
     * @return 分页结果
     */
    Map<String, Object> getDriverListByPage(Integer pageNum, Integer pageSize, Map<String, Object> queryParams);

    /**
     * 启用司机
     * 
     * @param driverId 司机ID
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean enableDriver(Long driverId, Long operatorId);

    /**
     * 禁用司机
     * 
     * @param driverId 司机ID
     * @param reason 禁用原因
     * @param operatorId 操作人ID
     * @return 是否成功
     */
    boolean disableDriver(Long driverId, String reason, Long operatorId);

    /**
     * 批量更新司机状态
     * 
     * @param driverIds 司机ID数组
     * @param status 状态
     * @param operatorId 操作人ID
     * @return 更新结果
     */
    Map<String, Object> batchUpdateDriverStatus(Long[] driverIds, String status, Long operatorId);

    /**
     * 司机统计分析
     */
    
    /**
     * 获取司机统计信息
     * 
     * @param driverId 司机ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param statisticsType 统计类型
     * @return 统计信息VO
     */
    DriverStatisticsVO getDriverStatistics(Long driverId, String startDate, String endDate, String statisticsType);

    /**
     * 获取司机分析报告
     * 
     * @param driverId 司机ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param analysisType 分析类型
     * @return 分析报告VO
     */
    DriverAnalysisVO getDriverAnalysis(Long driverId, String startDate, String endDate, String analysisType);

    /**
     * 获取在线司机数量
     * 
     * @param areaCode 区域代码
     * @return 在线司机数量
     */
    Integer getOnlineDriverCount(String areaCode);

    /**
     * 获取司机工作效率
     * 
     * @param driverId 司机ID
     * @param timeRange 时间范围
     * @return 工作效率数据
     */
    Map<String, Object> getDriverWorkEfficiency(Long driverId, String timeRange);

    /**
     * 获取司机收入统计
     * 
     * @param driverId 司机ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 收入统计数据
     */
    Map<String, Object> getDriverIncomeStatistics(Long driverId, String startDate, String endDate);

    /**
     * 数据导出导入
     */
    
    /**
     * 导出司机数据
     * 
     * @param driverIds 司机ID数组
     * @param exportType 导出类型
     * @param exportFields 导出字段
     * @return 导出文件路径
     */
    String exportDriverData(Long[] driverIds, String exportType, String[] exportFields);

    /**
     * 导入司机数据
     * 
     * @param driverList 司机列表
     * @param importType 导入类型
     * @return 导入结果消息
     */
    String importDriverData(List<Driver> driverList, String importType);

    /**
     * 司机推荐与匹配
     */
    
    /**
     * 智能推荐司机
     * 
     * @param orderId 订单ID
     * @param recommendType 推荐类型
     * @param location 位置信息
     * @return 推荐司机列表
     */
    List<Map<String, Object>> recommendDrivers(Long orderId, String recommendType, String location);

    /**
     * 匹配最优司机
     * 
     * @param orderId 订单ID
     * @param matchCriteria 匹配条件
     * @return 最优司机信息
     */
    Map<String, Object> matchOptimalDriver(Long orderId, Map<String, Object> matchCriteria);

    /**
     * 获取司机评分
     * 
     * @param driverId 司机ID
     * @param scoreType 评分类型
     * @return 评分信息
     */
    Map<String, Object> getDriverScore(Long driverId, String scoreType);

    /**
     * 更新司机评分
     * 
     * @param driverId 司机ID
     * @param scoreType 评分类型
     * @param score 评分
     * @param scoreRemark 评分备注
     * @return 是否成功
     */
    boolean updateDriverScore(Long driverId, String scoreType, Double score, String scoreRemark);

    /**
     * 系统管理
     */
    
    /**
     * 司机系统健康检查
     * 
     * @return 健康状态
     */
    Map<String, Object> driverSystemHealthCheck();

    /**
     * 数据同步
     * 
     * @param syncType 同步类型
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 是否成功
     */
    boolean syncDriverData(String syncType, String startDate, String endDate);

    /**
     * 缓存刷新
     * 
     * @param cacheType 缓存类型
     * @return 是否成功
     */
    boolean refreshDriverCache(String cacheType);

    /**
     * 性能优化
     * 
     * @param optimizationType 优化类型
     * @return 优化结果
     */
    Map<String, Object> optimizeDriverPerformance(String optimizationType);

    /**
     * 获取司机工作报告
     * 
     * @param driverId 司机ID
     * @param reportType 报告类型
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 工作报告
     */
    Map<String, Object> getDriverWorkReport(Long driverId, String reportType, String startDate, String endDate);

    /**
     * 司机培训管理
     * 
     * @param driverId 司机ID
     * @param trainingType 培训类型
     * @param trainingData 培训数据
     * @return 培训记录ID
     */
    Long recordDriverTraining(Long driverId, String trainingType, Map<String, Object> trainingData);

    /**
     * 获取司机培训记录
     * 
     * @param driverId 司机ID
     * @param trainingType 培训类型
     * @return 培训记录列表
     */
    List<Map<String, Object>> getDriverTrainingRecords(Long driverId, String trainingType);

    /**
     * 司机违规管理
     * 
     * @param driverId 司机ID
     * @param violationType 违规类型
     * @param violationDesc 违规描述
     * @param penaltyType 处罚类型
     * @param operatorId 操作人ID
     * @return 违规记录ID
     */
    Long recordDriverViolation(Long driverId, String violationType, String violationDesc, String penaltyType, Long operatorId);

    /**
     * 获取司机违规记录
     * 
     * @param driverId 司机ID
     * @param violationType 违规类型
     * @return 违规记录列表
     */
    List<Map<String, Object>> getDriverViolationRecords(Long driverId, String violationType);
}